package com.hsqyz.esp32_led.netty.channel;

import com.hsqyz.esp32_led.netty.codec.Esp32MessageCodec;
import com.hsqyz.esp32_led.netty.handler.Esp32SocketMsgInHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.IdleStateHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * netty服务初始化器
 * <p>
 * 该类是 Netty 框架中的一个 ChannelInitializer 实现，用于初始化 SocketChannel 的 ChannelPipeline。
 * 当新的 SocketChannel 创建时，会调用此初始化器来配置 ChannelPipeline，
 * 添加必要的编解码器、处理器等，以处理网络通信的数据流。
 *
 * <p>继承自 ChannelInitializer<SocketChannel>，覆盖了 initChannel 方法，
 * 该方法是 NioServerSocketChannelFactory 中的抽象方法 initChannel 的实现。
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class SocketChannelInitialize extends ChannelInitializer<SocketChannel> {

    private final Esp32SocketMsgInHandler socketMsgInHandler;

    /**
     * 初始化给定 SocketChannel 的 ChannelPipeline。
     * 这个方法是 NioServerSocketChannelFactory 中的抽象方法 initChannel 的实现。
     * 它被用来在创建新的 Channel 时配置 ChannelPipeline，从而添加必要的处理器。
     * 在这个实现中，主要任务是配置和初始化与业务逻辑相关的 ChannelHandler。
     *
     * @param socketChannel 提供一个待初始化的 SocketChannel。它是NIO中的一个关键类，用于处理网络I/O操作。
     * @throws Exception 如果在初始化过程中遇到任何异常，则抛出。异常处理机制依赖于上层调用者如何捕获和处理。
     */
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        // 创建一个LoggingHandler，用于记录日志信息。
        LoggingHandler loggingHandler = new LoggingHandler(LogLevel.INFO);
        // 获取或创建该SocketChannel的ChannelPipeline，ChannelPipeline用于管理Channel上的所有处理逻辑。
        ChannelPipeline pipeline = socketChannel.pipeline();

        // 打印日志信息，标识Channel初始化开始。这在日志系统中通常用于跟踪和调试目的。
        log.info("==============Netty init channel=========");

        // 添加日志处理器，用于记录日志信息。
        pipeline.addLast("loggingHandler", loggingHandler);
        // 添加LineBasedFrameDecoder，设置最大长度和换行符
        pipeline.addLast(new LineBasedFrameDecoder(1024));
        // 添加一个IdleStateHandler，用于处理空闲状态。
        pipeline.addLast(new IdleStateHandler(0, 0, 0));
        // 添加自定义的编解码器，用于处理网络通信的数据流。
        pipeline.addLast("nettyMessageCodec", new Esp32MessageCodec());
        // 添加自定义的处理进来的消息的处理器。
        pipeline.addLast(socketMsgInHandler);
    }


}